package com.ruizhong.integratedmediawithoutc.util;

//import net.bramp.ffmpeg.FFmpeg;
//import net.bramp.ffmpeg.FFmpegExecutor;
//import net.bramp.ffmpeg.builder.FFmpegBuilder;
//import net.bramp.ffmpeg.progress.Progress;
//import net.bramp.ffmpeg.progress.ProgressListener;
//import org.bytedeco.ffmpeg.ffmpeg;
//import org.bytedeco.ffmpeg.global.avcodec;
//import org.bytedeco.ffmpeg.global.avutil;
//import org.bytedeco.javacv.FFmpegFrameGrabber;
//import org.bytedeco.javacv.FFmpegFrameRecorder;
//import org.bytedeco.javacv.Frame;

import java.io.IOException;

public class RtspToRtmpStreamer {

    public static void transToFlvWithFFmpeg(String rtspUrl, String rtmpUrl) throws IOException {
//        //创建FFmpeg对象
//        FFmpeg ffmpeg = new FFmpeg("D:\\ffmepg\\ffmpeg-7.1.1-full_build\\bin\\ffmpeg.exe");     //参数是：ffmpeg命令工具的安装路径
//
////创建FFmpegBuilder对象，设置推流/转码参数
//        FFmpegBuilder builder = new FFmpegBuilder()
//                .setInput(rtspUrl)
//                .addExtraArgs("-rtsp_transport", "tcp") // RTSP over TCP
//                .overrideOutputFiles(true)
//                .addOutput(rtmpUrl)
//                .setFormat("flv") // 输出格式
//                .setVideoCodec("h264_amf") // AMF编码器
//                .addVideoOption("usage", "lowlatency")
//                .addVideoOption("quality", "balanced")
//                .addVideoOption("qp", "18")
//                .addVideoOption("maxrate", "6000k")
//                .addVideoOption("bufsize", "12000k")
//                .setVideoFilter("scale=1920:1080") // 缩放
//                .addVideoOption("g", "50") // GOP大小
//                .addVideoOption("keyint_min", "25") // 最小关键帧间隔
//                .setAudioCodec("aac") // 音频编码
//                .setAudioSampleRate(44100) // 采样率
//                .setAudioBitRate(128000) // 音频比特率 (128k)
//                .addExtraArgs("-fflags", "nobuffer") // 低延迟
//                .addExtraArgs("-flags", "low_delay")
//                .done();                                               //最后调用done()完成参数配置
//
//
////创建FFmpegExecutor对象，用于执行ffpmeg转流任务
//        FFmpegExecutor executor = new FFmpegExecutor(ffmpeg);
//
////执行ffpmeg转流任务，并添加了监听器ProgressListener，可以监听ffpmeg运行状态情况
//        executor.createJob(builder, new ProgressListener() {
//            @Override
//            public void progress(Progress progress) {
//                System.out.println("-----------");
//                System.out.println(progress);
//            }
//        }).run();
    }

    public static void transToFlvWithProcessBuilder(String rtspUrl, String rtmpUrl) {
        try {
//            软编码 h265转h264
//            ProcessBuilder builder = new ProcessBuilder(
//                    "ffmpeg",
//                    "-analyzeduration", "10M",
//                    "-probesize", "10M",
//                    "-rtsp_transport", "tcp",
//                    "-i", rtspUrl,
//                    "-c:v", "libx264",
//                    "-preset", "ultrafast",
//                    "-crf", "23",
//                    "-maxrate", "6000k",
//                    "-bufsize", "12000k",
//                    "-vf", "scale=1920:1080",
//                    "-g", "50",
//                    "-keyint_min", "25",
//                    "-c:a", "aac",
//                    "-ar", "44100",
//                    "-b:a", "128k",
//                    "-fflags", "nobuffer",
//                    "-flags", "low_delay",
//                    "-f", "flv",
//                    rtmpUrl
//            );
            //            软编码 不转码
            ProcessBuilder builder = new ProcessBuilder(
                    "ffmpeg",
                    "-i", rtspUrl,
                    "-fflags", "nobuffer",
                    "-flags", "low_delay",
                    "-c:v", "copy",
                    "-c:a", "copy",
                    "-f", "flv",
                    rtmpUrl
            );
//            软编码 轻转码
//            ProcessBuilder builder = new ProcessBuilder(
//                    "ffmpeg",
//                    "-rtsp_transport", "tcp",          // 强制TCP传输RTSP
//                    "-i", rtspUrl, // 输入流地址
//                    "-c:v", "libx264",                // 视频编码器
//                    "-preset", "superfast",           // 编码速度/质量平衡
//                    "-crf", "23",                     // 恒定质量因子
//                    "-maxrate", "3000k",              // 最大码率
//                    "-bufsize", "6000k",              // 码率控制缓冲区
//                    "-vf", "scale=1920:1080",         // 分辨率缩放
//                    "-g", "50",                       // GOP大小
//                    "-c:a", "copy",                    // 音频编码器
//                    "-fflags", "nobuffer",            // 减少输入缓冲
//                    "-flags", "low_delay",            // 低延迟模式
//                    "-f", "flv",                      // 输出格式
//                    rtmpUrl // 输出地址
//            );
//            软编码 亲转码不限制码率
//            ProcessBuilder builder = new ProcessBuilder(
//                    "ffmpeg",
//                    "-analyzeduration", "10M",
//                    "-probesize", "10M",
//                    "-rtsp_transport", "tcp",
//                    "-i", rtspUrl,
//                    "-c:v", "libx264",
//                    "-preset", "ultrafast",
//                    "-g", "50",
//                    "-c:a", "aac",
//                    "-f", "flv",
//                    rtmpUrl
//            );

//            硬编码
//            ProcessBuilder builder = new ProcessBuilder(
//                    "ffmpeg",
//                    "-rtsp_transport", "tcp",
//                    "-i", rtspUrl,
//                    "-c:v", "h264_amf",
//                    "-usage", "lowlatency",
//                    "-quality", "balanced",
//                    "-qp", "18",
//                    "-maxrate", "6000k",
//                    "-bufsize", "12000k",
//                    "-vf", "scale=1920:1080",
//                    "-g", "50",
//                    "-keyint_min", "25",
//                    "-c:a", "aac",
//                    "-ar", "44100",
//                    "-b:a", "128k",
//                    "-fflags", "nobuffer",
//                    "-flags", "low_delay",
//                    "-f", "flv",
//                    rtmpUrl
//            );

            builder.redirectOutput(ProcessBuilder.Redirect.DISCARD);
            builder.redirectError(ProcessBuilder.Redirect.DISCARD);
            Process process = builder.start();

            // 启动线程实时读取输出

//            new Thread(() -> {
//                try {
//                    InputStream is = process.getInputStream();
//                    byte[] data = new byte[128];
//                    int len = -1;
//                    while ((len = is.read(data)) != -1) {
//                        System.out.println(new String(data,0,len));
//                    }
////                    raf.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }, "Thread-Normal").start();


//多线程读取错误输出信息 process.getErrorStream()
//            new Thread(() -> {
//                try {
//                    InputStream is = process.getErrorStream();
//
//                    byte[] data = new byte[128];
//                    int len = -1;
//                    while ((len = is.read(data)) != -1) {
//                        System.out.println(new String(data,0,len));
//                    }
////                    raf.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }, "Thread-Error").start();


            // 主线程等待 FFmpeg 结束（可选）
            int exitCode = process.waitFor();
            System.out.println("FFmpeg 已退出，代码: " + exitCode);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void transToFlv(String rtspUrl, String rtmpUrl) {
//        avutil.av_log_set_level(avutil.AV_LOG_QUIET);
//        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(rtspUrl);
//        FFmpegFrameRecorder recorder = null;
//
//        try {
//            // 设置RTSP使用TCP传输
//            grabber.setOption("rtsp_transport", "tcp");
//            grabber.setOption("hwaccel", "auto");  // 自动选择硬件加速
//            grabber.setOption("threads", "4");
//            // 开启抓取器
//            grabber.start();
//
//            // 创建录制器
//            recorder = new FFmpegFrameRecorder(rtmpUrl,
//                    grabber.getImageWidth(), grabber.getImageHeight(),
//                    grabber.getAudioChannels());
//
//            // 视频编码设置
//            recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
//            recorder.setOption("vcodec", "h264_amf");
//            recorder.setOption("usage", "lowlatency");
//            recorder.setOption("quality", "balanced");
//            recorder.setOption("qp", "18");
//            recorder.setVideoOption("threads", "4");  // 编码线程数
//            recorder.setVideoOption("crf", "23");
//            recorder.setVideoOption("maxrate", "6000k");
//            recorder.setVideoOption("bufsize", "12000k");
//            recorder.setVideoOption("g", "60");
//            recorder.setVideoOption("bf", "3");
//            recorder.setVideoOption("keyint_min", "25");
//
////            // 视频缩放
//            recorder.setImageWidth(1920);
//            recorder.setImageHeight(1080);
//
//            // 音频编码设置
//            recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
//            recorder.setSampleRate(44100);
//            recorder.setAudioBitrate(128000); // 128k
//
//            // 低延迟设置
//            recorder.setOption("fflags", "nobuffer");
//            recorder.setOption("flags", "low_delay");
//
//            // 输出格式
//            recorder.setFormat("flv");
//
//            // 开启录制器
//            recorder.start();
//
//            Frame frame;
//            while ((frame = grabber.grab()) != null) {
//                // 处理视频帧
//                if (frame.image != null) {
//                    recorder.record(frame);
//                }
//                // 处理音频帧
//                if (frame.samples != null) {
//                    recorder.record(frame);
//                }
//            }
//            System.out.println("转码结束");
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                if (recorder != null) {
//                    recorder.stop();
//                    recorder.release();
//                }
//                grabber.stop();
//                grabber.release();
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }


    }


}